#!/usr/bin/env node

const { execSync } = require("child_process");
const fs = require("fs");
const path = require("path");
const { getFirstFileNameWithoutExt } = require("./utils/common");
const { generateWordASSFromFile } = require("./utils/wordAssGenerator"); // 添加单词字幕生成函数
const config = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "config.json"), "utf8"));

// run-video 主功能
async function runVideo(type) {
  console.log("开始一键生成视频...");

  // Parse arguments for the run-video command
  // Format: node index.js run-video [srt_number] [max_images] [video_args...]
  let videoSrtName = "1";
  let videoMaxImages = "20";
  let videoProjectArgs = ["1", "1", "-a", "--use-dat-duration"];

  // videoProjectArgs 第一个参数默认读取config.inputDirMp3下的第一个文件名称,不包含后缀.mp3
  const firstMp3Name = getFirstFileNameWithoutExt(config.inputDirMp3, ".mp3");
  if (firstMp3Name) {
    console.log(` ===== > Using mp3 file ${firstMp3Name}`);
    videoProjectArgs[0] = firstMp3Name;
  }

  // 清理config.inputDirImages下的文件
  fs.existsSync(config.inputDirImages) && fs.rmSync(config.inputDirImages, { recursive: true, force: true });
  // 清理config.outputDirSrt下的文件
  fs.existsSync(config.outputDirSrt) && fs.rmSync(config.outputDirSrt, { recursive: true, force: true });

  try {
    if (type === "ass") {
      // 检查 inputDirDat 目录下是否已存在 ASS 文件
      let assFiles = [];
      if (fs.existsSync(config.inputDirDat)) {
        assFiles = fs
          .readdirSync(config.inputDirDat)
          .filter(file => path.extname(file).toLowerCase() === ".ass")
          .map(file => path.join(config.inputDirDat, file));
      }
      if (assFiles.length === 0) {
        console.log(`  采用直接使用ass的模式，但是未找到 ASS 文件，请检查 inputDirDat 目录`);
        process.exit(1);
      }
      // 如果存在 ASS 文件，直接使用它
      console.log("\n步骤 1/3: 检测到现有ASS文件，跳过转换步骤...");
      // 复制 ASS 文件到 outputDirSrt 目录
      const sourceAssFile = assFiles[0];
      console.log(` ===== > Using ass file ${sourceAssFile}`);
      const targetAssFile = path.join(config.outputDirSrt, path.basename(sourceAssFile));

      // 确保 outputDirSrt 目录存在
      if (!fs.existsSync(config.outputDirSrt)) {
        fs.mkdirSync(config.outputDirSrt, { recursive: true });
      }

      // 复制文件
      fs.copyFileSync(sourceAssFile, targetAssFile);
      console.log(`  直接使用ASS文件: ${sourceAssFile}`);

      // 生成单词字幕文件
      const fileName = path.basename(targetAssFile, ".ass");
      const wordAssFilePath = path.join(config.outputDirSrt, `${fileName}_words.ass`);
      console.log("  生成单词字幕文件...");
      await generateWordASSFromFile(targetAssFile, wordAssFilePath, config.projectSettings.wordStyles);
      // 更新videoProjectArgs中的字幕文件名
      const updatedFirstAssName = getFirstFileNameWithoutExt(config.outputDirSrt, ".ass");
      // 根据Dialogue:数量计算台词行数
      videoMaxImages = fs.readFileSync(path.join(config.inputDirDat, `${updatedFirstAssName}.ass`), "utf8").split("Dialogue: ").length;
      if (updatedFirstAssName) {
        videoProjectArgs[1] = updatedFirstAssName;
        videoSrtName = updatedFirstAssName; // 同步更新videoSrtName

        // 更新音频文件名以匹配字幕文件名（如果对应的音频文件存在）
        const sourceMp3Path = path.join(__dirname, "..", config.inputDirMp3, `${updatedFirstAssName}.mp3`);
        if (fs.existsSync(sourceMp3Path)) {
          videoProjectArgs[0] = updatedFirstAssName;
        }
      }
    } else if (type === "dat") {
      const id = config.inputDirDat;
      let firstDatName = getFirstFileNameWithoutExt(id, ".dat");
      let firstAssName = path.join(config.outputDirSrt, `${firstDatName}.ass`);
      firstDatName = path.join(__dirname, "../", id, `${firstDatName}.dat`);
      if (firstAssName) {
        videoProjectArgs[1] = firstAssName;
        videoSrtName = firstAssName; // 确保videoSrtName与firstAssName一致
      }
      const customTitle = `${config.title}`;
      const titleFilePath = path.join(__dirname, "../temp/", "temp_title.txt");
      console.log(`  设置视频标题: ${customTitle}`);
      fs.writeFileSync(titleFilePath, customTitle, "utf-8");
      // Step 1: Generate subtitle files
      console.log("\n步骤 1/3: 生成字幕文件...");
      console.log(` ===== > Using dat file ${firstDatName}`);
      execSync(`node src/convert_all.js ${firstDatName}`, { stdio: "inherit" });
      // 更新videoProjectArgs中的字幕文件名
      const updatedFirstAssName = getFirstFileNameWithoutExt(config.outputDirSrt, ".ass");
      if (updatedFirstAssName) {
        videoProjectArgs[1] = updatedFirstAssName;
        videoSrtName = updatedFirstAssName; // 同步更新videoSrtName

        // 更新音频文件名以匹配字幕文件名（如果对应的音频文件存在）
        const sourceMp3Path = path.join(__dirname, "..", config.inputDirMp3, `${updatedFirstAssName}.mp3`);
        if (fs.existsSync(sourceMp3Path)) {
          videoProjectArgs[0] = updatedFirstAssName;
        }
      }
    } else {
      console.log("必须指定合法的type 参数，当前设定的type参数无效：", type);
      process.exit(1);
    }

    // Step 2: Download images
    console.log("\n步骤 2/3: 下载图片...");
    // videoSrtName已经通过上面的代码更新为正确的ASS文件名
    // Use the correct path for ASS files
    const downloadCommand = `node src/download_images.js ${videoSrtName} ${videoMaxImages}`;
    execSync(downloadCommand, { stdio: "inherit" });

    // Step 3: Create video
    console.log("\n步骤 3/3: 创建视频...");
    execSync(`node src/create_video.js ${videoProjectArgs.join(" ")}`, {
      stdio: "inherit",
    });

    console.log("\n✅ 一键生成视频完成！");
  } catch (error) {
    console.error("！！！\n❌ 执行过程中出现错误:", error.message);
    process.exit(1);
  }
}

module.exports = { runVideo };
